package tpgrandt.dao;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;
import tpgrandt.control.*;
import tpgrandt.excepciones.ContraseñaInvalidaException;
import tpgrandt.excepciones.UsuarioInexistenteException;

/**
 * @version 1.0
 * @created 19-Jan-2010 18:39:28
 */
public class UsuarioDAO {

        public static boolean buscarPersona(int tipo, int documento) {
            try {
                if(buscar(tipo, documento).next())
                    return true;
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                return false;
            }
        }

        private static ResultSet buscar(int tipo, int documento) throws SQLException {
            Statement st = DAO.getStatement();
            String query = "SELECT * FROM persona " +
			   "WHERE tipo = " + tipo +
			   " AND documento = " + documento + ";";
            ResultSet rs = st.executeQuery(query);
            return rs;
        }

	/**
	 * 
	 * @param tipo
	 * @param documento
	 * @param pass
	 */
	public static Usuario autentificar(int tipo, int documento, String pass)
                throws ContraseñaInvalidaException, UsuarioInexistenteException {
	    try {

		// encriptacion de la pass
		String sha1 = "";
		MessageDigest md = MessageDigest.getInstance("SHA1");
		md.update(pass.getBytes());
		byte[] digest = md.digest();
		for (byte aux : digest) {
		    int b = aux & 0xff;
		    if (Integer.toHexString(b).length() == 1) {
			sha1 += "0";
		    }
		    sha1 += Integer.toHexString(b);
		}
		// fin encriptacion de la pass
		
		try {
		    ResultSet rs = buscar(tipo, documento);
                    if (rs.next()) {
                        if (sha1.equals(rs.getString("contrasenia"))) {
                            switch (rs.getInt("perfil")) {
                                case 0:
                                    return new GestionParticipante(tipo, documento);
                                case 1:
                                    return new Periodista(tipo, documento);
                                case 2:
                                    return new Administrador(tipo, documento);
                            }
                        } else
                            throw new ContraseñaInvalidaException();
		    } else
                        throw new UsuarioInexistenteException();
		} catch (SQLException e) {
		    // TODO Auto-generated catch block
		    e.printStackTrace();
		}
	    } catch (NoSuchAlgorithmException ex) {
		Logger.getLogger(UsuarioDAO.class.getName()).log(Level.SEVERE, null, ex);
	    }
	    return null;
	}
}